#ifndef _EVENT_TIMED_TASK_H_
#define _EVENT_TIMED_TASK_H_

#include <stdint.h>
#include <string.h>
#include <stdbool.h>

#define EVENT_TASK_ATTACHED_PARAM_SIZE                        (100ul) // 任务附加参数大小

/**
 * @brief 事件处理方法
 *
 */
typedef void (*EventHandler_t)(void);

/**
 * @brief 定时任务方法
 *
 */
typedef bool (*ScheduledTask_t)(void);

/**
 * @brief 任务执行方法
 *
 */
typedef bool (*TaskExecuteCallback_t)(void);

/**
 * @brief 强制退出任务方法
 *
 */
typedef bool (*TaskExitCallback_t)(void);

/**
 * @brief 定时任务级别
 *
 */
typedef enum
{
  TIMED_TASK_LOW_LEVEL,  // 低等级
  TIMED_TASK_HIGH_LEVEL, // 高等级
} TimedTaskLevel;

// 任务表附带参数
typedef struct  __attribute__((aligned(4)))
{
  uint8_t Level;                                 // 任务等级
  uint8_t AutoDestroy;                           // 自动销毁
  uint16_t Timeout;                              // 超时时间
  uint8_t Param[EVENT_TASK_ATTACHED_PARAM_SIZE]; // 附加参数

  TaskExitCallback_t Exit;       // 任务退出方法
  TaskExecuteCallback_t Execute; // 任务执行方法
} TaskAttachedParam_t;

/**
 * @brief 定时任务表结构
 *
 */
typedef struct TimedNode
{
  bool En;                       // 使能位
  uint32_t TriggerTime;          // 定时时间
  uint32_t AccruedTime;          // 累加时间
  TimedTaskLevel Level;          // 级别
  ScheduledTask_t ScheduledTask; // 回调任务

  struct TimedNode *NextItem;     // 子节点
  struct TimedNode *PreviousItem; // 父节点
} *TimedListNode_t, TimedTable_t;

/**
 * @brief 事件表结构
 *
 */
typedef struct EventHandlerNode
{
  EventHandler_t Handler;                // 事件类型

  struct EventHandlerNode *NextItem;     // 子节点
  struct EventHandlerNode *PreviousItem; // 父节点
} *EventHandlerListNode_t, EventHandlerTable_t;

/**
 * @brief 任务调度表结构
 *
 */
typedef struct ScheduleNode
{
  TaskAttachedParam_t AttachedParam; // 任务附加参数

  struct ScheduleNode *NextItem;     // 下一个任务
  struct ScheduleNode *PreviousItem; // 上一个任务
} *TaskScheduleNode_t, TaskScheduleTable_t;

/**
 * @brief 创建返回链表的头节点
 *
 * @return TaskScheduleNode_t - 节点
 */
extern TaskScheduleNode_t EventListCreate(void);

/**
 * @brief 双向链表销毁
 *
 * @param HeadNode - 链表头
 */
extern void EventListDestroy(TaskScheduleNode_t HeadNode);

/**
 * @brief 双向链表查找
 *
 * @param HeadNode           - 链表头
 * @param Level              - 任务等级
 * @return TaskScheduleNode_t - 节点
 */
extern TaskScheduleNode_t EventListFind(TaskScheduleNode_t HeadNode, uint8_t Level);

/**
 * @brief 实现节点的获取
 *
 * @param pFileTable          - 资源表
 * @return TaskScheduleNode_t - 节点
 */
extern TaskScheduleNode_t EventBuyNode(TaskAttachedParam_t *pFileTable);

/**
 * @brief 双向链表在pos的前面进行插入
 *
 * @param Pos        - 位置
 * @param pFileTable - 资源表
 * @return bool      - 插入状态（ture：成功 false：失败）
 */
extern bool EventInsertionNode(TaskScheduleNode_t Pos, TaskAttachedParam_t *pFileTable);

/**
 * @brief 双向链表删除pos位置的节点
 *
 * @param Pos - 位置
 */
extern void EventListErase(TaskScheduleNode_t Pos);

/**
 * @brief 双向链表尾插
 *
 * @param HeadNode   - 链表头
 * @param pFileTable - 资源表
 * @return bool      - 插入状态（ture：成功 false：失败）
 */
extern bool EventListPushBack(TaskScheduleNode_t HeadNode, TaskAttachedParam_t *pFileTable);

/**
 * @brief 双向链表尾删
 *
 * @param HeadNode - 链表头
 */
extern void EventListPopBack(TaskScheduleNode_t HeadNode);

/**
 * @brief 双向链表头插
 *
 * @param HeadNode   - 链表头
 * @param pFileTable - 资源表
 * @return bool      - 插入状态（ture：成功 false：失败）
 */
extern bool EventListPushFront(TaskScheduleNode_t HeadNode, TaskAttachedParam_t *pFileTable);

/**
 * @brief 双向链表头删
 *
 * @param HeadNode - 链表头
 */
extern void EventListPopFront(TaskScheduleNode_t HeadNode);

#endif
